package schedule

import "time"

// 实现Cron解析器
type cronSchedule struct {
	sec    int
	min    int
	hour   int
	dom    int
	month  time.Month
	dow    int
	millis int
}

func (s *cronSchedule) Next(t time.Time) time.Time {
	// 实现Cron计算逻辑（此处简化为关键路径）
	next := t.Add(1 * time.Millisecond)
	for {
		next = next.Add(time.Duration(1000-next.Nanosecond()/1e6) * time.Millisecond)
		if s.millis != -1 && next.Nanosecond()/1e6 != s.millis {
			continue
		}
		if !s.matchTime(next) {
			next = next.Add(time.Second - time.Duration(next.Nanosecond())*time.Nanosecond)
			continue
		}
		break
	}
	return next
}

// matchTime 检查时间是否符合Cron规则
func (s *cronSchedule) matchTime(t time.Time) bool {
	// 毫秒检查（必须精确匹配）
	if s.millis != -1 && t.Nanosecond()/1e6 != s.millis {
		return false
	}

	// 秒级检查（0-59）
	if s.sec != -1 && t.Second() != s.sec {
		return false
	}

	// 分钟检查（0-59）
	if s.min != -1 && t.Minute() != s.min {
		return false
	}

	// 小时检查（0-23）
	if s.hour != -1 && t.Hour() != s.hour {
		return false
	}

	// 日期双校验逻辑（日与星期互斥）
	if s.dom != -1 || s.dow != -1 {
		dateMatch, weekMatch := true, true

		// 日期检查（1-31）
		if s.dom != -1 {
			dateMatch = t.Day() == s.dom
		}

		// 星期检查（0-6，0=周日）
		if s.dow != -1 {
			weekMatch = int(t.Weekday()) == s.dow
		}

		// 标准Cron逻辑：日期和星期满足其一即可
		if !dateMatch && !weekMatch {
			return false
		}
	}

	// 月份检查（1-12）
	if s.month != -1 && t.Month() != s.month {
		return false
	}

	return true
}
